iT邦幫忙

2026 iThome 鐵人賽

DAY 5
0

Day 8 把不穩的辨別度往 0 收縮,留下 。正值表示高信心較常答對,負值表示高信心反而容易答錯,0 則停在普通 Self-Consistency。

方向有了,票重要放大多少還沒決定。最省事的做法是把 γ 丟進一組候選值試跑,再挑開發集最高分;TACT 想避開這層搜尋,所以用一個工作模型把 映射成 γ。

從 AUC 換成常態分離度

Day 5 已經用過 D=2AUC-1,因此收縮後的 AUC 可以寫成 (1+D̃)/2

假設同一題內,正確與錯誤軌跡的 van der Waerden 分數 φ 各自近似常態分布,兩邊共用類別內變異數 。令兩個平均值的差為 Δ=μ₁-μ₀,再定義標準化分離度 u=Δ/s

等變異常態模型下,AUC 和 u 的關係是:

從 AUC 推回常態分離度

Φ 是標準常態累積分布函數。D̃=0 時,AUC 是 0.5,u 也等於 0。負 D̃ 會得到負 u,方向自然被保留下來。

題內標準化改變了類別內變異數

Day 4 把每題的 φ 標準化成整體平均 0、變異數 1。這個「整體」混合了正確與錯誤軌跡,所以 不一定等於 1。

為開發集中單條軌跡答對的比例。混合分布的變異數可以拆成類別內變異與兩類平均差造成的變異:

混合分布變異數分解

整理後得到:

s² = 1 / [1 + p̄(1-p̄)u²]

當正確與錯誤軌跡分得越開,整體變異中就有越多來自兩組平均值的距離,單一類別內的 反而小於 1。

這裡的 是所有開發軌跡的正確比例,不是最終題目準確率,也不是 Self-Consistency 的得分。實作會把它限制在 [0.05, 0.95],避免極端小樣本把修正推到奇怪的邊界。

Bayes discriminant 給出票重斜率

兩個等變異常態分布的 log likelihood ratio 對 φ 是線性的。和 φ 相乘的斜率為 Δ/s²,它正好可以當成指數票重的係數:

Bayes discriminant 對應的 gamma

票重仍是前幾篇看過的形式:

w_i = exp(γ φ_i)

γ 為正,高排名信心票變重;γ 為負,低排名信心票變重。類別先驗會影響 likelihood ratio 的截距,但同一題所有候選票共享那個常數,投票 argmax 真正需要的是斜率。

化成一個 probit 和一個平方根

令:

z = Φ⁻¹((1 + D̃) / 2)

因為 u=√2z,前面的式子可以直接化簡成:

TACT 一般形式的 gamma link

預設 p̄=1/2 時更短:

p bar 等於二分之一時的 gamma

這裡沒有再訓練一個迴歸器,也沒有搜尋 {0.25, 0.5, 1, 2, 4}。輸入只有前面算好的

D̃ 變大時,γ 長多快

以下使用 p̄=0.5,先不套上限:

D̃        z         γ
 0.00    0.000     0.000
 0.10    0.126     0.178
 0.25    0.319     0.462
 0.50    0.674     1.057
 0.75    1.150     2.097
 0.90    1.645     3.568
 0.95    1.960     4.737
-0.50   -0.674    -1.057

映射是奇函數, 換號時 γ 也跟著換號。接近 0 時,γ 平順地從 0 長出來; 接近 ±1,probit 會快速變大。

因此實作必須先把 夾在 (-1, 1) 內,還要對 γ 設上限。TACT-dev 使用 γ_max=4,label-free 使用 γ_max=2。上表的 D̃=0.95 原始 γ 為 4.737,dev 路徑實際只會使用 4。

截斷不是排版上的小修飾。估計飽和時,真正進入投票的是 γ_max,推導出的原始幅度已經不再主導結果;實驗解讀時要把「公式輸出」和「截斷後使用值」分開記錄。

Python 實作

下面的程式直接使用化簡後的式子:

import numpy as np
from scipy.stats import norm

def gamma_from_d_tilde(
    d_tilde: float,
    p_bar: float | None = 0.5,
    gamma_max: float = 4.0,
) -> float:
    if gamma_max <= 0:
        raise ValueError("gamma_max must be positive")

    d = float(np.clip(d_tilde, -1.0 + 1e-9, 1.0 - 1e-9))
    z = float(norm.ppf((1.0 + d) / 2.0))

    if p_bar is None:
        gamma = np.sqrt(2.0) * z
    else:
        p = float(np.clip(p_bar, 0.05, 0.95))
        gamma = z * np.sqrt(
            2.0 + 4.0 * p * (1.0 - p) * z ** 2
        )

    return float(np.clip(gamma, -gamma_max, gamma_max))

測試符號、0 錨點和上限:

assert gamma_from_d_tilde(0.0) == 0.0
assert gamma_from_d_tilde(0.5) > 0.0
assert gamma_from_d_tilde(-0.5) < 0.0
assert np.isclose(
    gamma_from_d_tilde(-0.5),
    -gamma_from_d_tilde(0.5),
)
assert gamma_from_d_tilde(0.95, gamma_max=4.0) == 4.0

無標籤路徑不知道真正的 ,因此傳入 None,省略混合變異修正,使用 γ=√2z。以 D̃=0.9 為例,未修正值約 2.326,p̄=0.5 時則是 3.568。後者大約高 53%,所以缺少標籤時不能假裝知道基準正確率。

從信心辨別方向到加權結果的合成掃描

圖:將真實信心—正確性耦合從負值掃到正值。γ 的符號決定票重往哪個方向傾斜;接近零時,各方法回到 SC 附近,離零越遠才有足夠訊號拉開差距。

這個推導有工作假設

van der Waerden 分數在軌跡數夠多時才逐漸接近常態。每題只有 4 條軌跡時,φ 就只有四個離散值;等變異常態模型不會突然變成精確真相。題內使用實際標準差能修正尺度,補不了分布形狀。

γ 因而是工作模型下的推導值,不是對所有 LLM、所有取樣預算都成立的神諭。需要用不同 K、不同模型能力和不同信心來源做壓力測試,也要保留網格搜尋作為比較基準。推導的價值在於少一層結果導向調參,並讓正負方向、0 錨點和單調性可以逐項檢查。

Day 10 會把目前散在九篇裡的步驟收回同一個公式:題內排名、pooled D、保守 SE、死區收縮、probit link 和最終投票。接著會把公式逐段對到一份能執行的 TACT-dev 程式。

論文預印本:TACT: Trust-Anchored Confidence Tempering for Self-Consistency Voting in Large Language Models


上一篇
Day 8|證據不夠就別加權:TACT 的死區怎麼工作?
系列文
從多數決到可信投票:30 天打造 TACT 大語言模型推理聚合方法9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言